/*  引入router  */
import router from '@/router'
/*  引入store  */
import store from '@/store'
/* 引入进度条 */
import NProgress from 'nprogress'
/* 用于获取网页标题 */
import getPageTitle from '@/utils/get-page-title'
/* 引入ElementUI的提示组件 */
import { Notification } from 'element-ui'

/* 白名单数组(不需要登录就能访问的页面) */
const whiteList = ['/login', '/404']
/* 配置全局前置路由守位 */
router.beforeEach(async(to, from, next) => {
  NProgress.start()
  /*登录的判断：
  *   1.从store中的getters中取出用户的token
  *   2.判断用户是否有token,如果有token判断是否去登录页，去的是登录页终止当前执行停留当前页
  *   3.去的不是登录页，首页先判断用户是否已经有个人信息如果有直接放行，没有个人信息派发一个action获取用户信息,获取成功放行，获取失败(代表token过期)清除本地用户信息跳转登录页
  * 未登录的判断：
  *   1.判断去的路径在不在白名单数组里面(不需要登录就能访问的页面)，如果在则放行，不在则跳转到登录页
  **/
  const token = store.getters.token
  if (token) {
    if (to.path === '/login') {
      next(false)
      NProgress.done()
      Notification({ type: 'info', message: '您已登录', title: '消息' })
    } else {
      if (store.getters.userId) {
        next()
      } else {
        try {
          /* roles是当前用户的权限字段（menus：页面级别 points：按钮级别） */
          const { roles } = await store.dispatch('user/fetchUserInfoAction')
          /* 派发一个action传入当前用户的(menus页面级别路由)去和项目中的所有异步路由(asyncRoutes)进行筛选生成最终路由(resultRoutes)  */
          const resultRoutes = await store.dispatch('menu/addRoutesAction', roles.menus)
          /* 派发一个action传入当前用户的(points按钮级别权限) */
          store.dispatch('menu/addPointsAction', roles.points)
          /* 路由系统添加最终路由到路由表 (404路由必须在最后解决刷新404)*/
          router.addRoutes([...resultRoutes, { path: '*', redirect: '/404', hidden: true }])
          /* next({ ...to, replace: true }) 解决白屏 */
          next({ ...to, replace: true })
        } catch (e) {
          await store.dispatch('user/logoutAction')
          Notification({ type: 'warning', message: e.message, title: '警告' })
          next('/login')
          NProgress.done()
        }
      }
    }
  } else {
    if (whiteList.includes(to.path)) {
      next()
    } else {
      next('/login')
      NProgress.done()
      Notification({ type: 'warning', message: '请您登录', title: '警告' })
    }
  }
})

/* 配置全局后置路由守位 */
router.afterEach((to, from) => {
  NProgress.done()
  document.title = getPageTitle(to.meta.title)
})
